#ifndef _REFEREE_H_
#define _REFEREE_H_

/* 根据裁判系统串口协议附录V1.6.1编写 详细查询官网附录 */
#include "struct_typedef.h"

/***************************************裁判命令码ID***************************************/

#define REFEREE_CMD_ID_GAME_STATUS                       0x0001     //裁判命令码 比赛状态数据 
#define REFEREE_CMD_ID_GAME_RESULT                       0x0002     //裁判命令码 比赛结果数据
#define REFEREE_CMD_ID_GAME_ROBOT_HP                     0x0003     //裁判命令码 机器人血量数据
#define REFEREE_CMD_ID_GAME_EVENT_DATA                   0x0101     //裁判命令码 场地事件数据
#define REFEREE_CMD_ID_GAME_EXT_SUPPLY_PROJECTILE_ACTION 0x0102     //裁判命令码 补给站动作标识数据
#define REFEREE_CMD_ID_REFEREE_WARNING                   0x0104     //裁判命令码 裁判警告数据
#define REFEREE_CMD_ID_DART_INFO                         0x0105     //裁判命令码 飞镖发射相关数据
#define REFEREE_CMD_ID_ROBOT_STATUS                      0x0201     //裁判命令码 机器人性能体系数据
#define REFEREE_CMD_ID_POWER_HEAT_DATA                   0x0202     //裁判命令码 实时底盘功率和枪口热量数据
#define REFEREE_CMD_ID_ROBOT_POS                         0x0203     //裁判命令码 机器人位置数据
#define REFEREE_CMD_ID_BUFF                              0x0204     //裁判命令码 机器人增益数据
#define REFEREE_CMD_ID_AIR_SUPPORT_DATA                  0x0205     //裁判命令码 空中支援事件数据
#define REFEREE_CMD_ID_HURT_DATA                         0x0206     //裁判命令码 伤害状态数据
#define REFEREE_CMD_ID_SHOOT_DATA                        0x0207     //裁判命令码 实时射击数据
#define REFEREE_CMD_ID_PROJIECTILE_ALLOWANCE             0x0208     //裁判命令码 允许发弹量数据
#define REFEREE_CMD_ID_RFID_STATUS                       0x0209     //裁判命令码 机器人RFID模块状态 
#define REFEREE_CMD_ID_DART_CLIENT_CMD                   0x020A     //裁判命令码 飞镖选手端数据
#define REFEREE_CMD_ID_GROUND_ROBOT_POSITION             0x020B     //裁判命令码 地面机器人位置数据
#define REFEREE_CMD_ID_RADAR_MARK_DATA                   0x020C     //裁判命令码 雷达标记进度数据
#define REFEREE_CMD_ID_SENTRY_INFO                       0x020D     //裁判命令码 哨兵自主决策信息同步
#define REFEREE_CMD_ID_RADAR_INFO                        0x020E     //裁判命令码 雷达自主决策信息同步
#define REFEREE_CMD_ID_ROBOT_INTERACTION_DATA            0x0301     //裁判命令码 机器人交互数据
#define REFEREE_CMD_ID_CUSTOM_ROBOT_DATA                 0x0302     //裁判命令码 自定义遥控器与机器人交互数据 由发送方触发发送
#define REFEREE_CMD_ID_MAP_COMMAND                       0x0303     //裁判命令码 选手端小地图交互数据 由选手端触发发送
#define REFEREE_CMD_ID_REMOTE_CONTROL                    0x0304     //裁判命令码 键鼠遥控数据 由发送方触发发送
#define REFEREE_CMD_ID_MAP_ROBOT_DATA                    0x0305     //裁判命令码 选手端小地图接收雷达数据
#define REFEREE_CMD_ID_CUSTOM_CLIENT_DATA                0x0306     //裁判命令码 自定义遥控器与选手端交互数据
#define REFEREE_CMD_ID_MAP_DATA                          0x0307     //裁判命令码 选手端小地图接收哨兵数据
#define REFEREE_CMD_ID_CUSTOM_INFO                       0x0308     //裁判命令码 选手端小地图接收机器人数据

#define REFEREE_CMD_ID_SENTRY_CMD                        0x0120     //裁判命令码 哨兵自主决策指令
#define REFEREE_CMD_ID_RADAR_CMD                         0x0121     //裁判命令码 雷达自主决策指令

/***************************************裁判ID编号***************************************/

#define REFEREE_MARK_ID_RED_HERO                    1           //红方英雄机器人ID编号
#define REFEREE_MARK_ID_RED_ENGINEER                2           //红方工程机器人ID编号
#define REFEREE_MARK_ID_RED_INFANTRY_3              3           //红方3号步兵机器人ID编号
#define REFEREE_MARK_ID_RED_INFANTRY_4              4           //红方4号步兵机器人ID编号
#define REFEREE_MARK_ID_RED_INFANTRY_5              5           //红方5号步兵机器人ID编号
#define REFEREE_MARK_ID_RED_AIR                     6           //红方空中机器人ID编号
#define REFEREE_MARK_ID_RED_SENTRY                  7           //红方哨兵机器人ID编号
#define REFEREE_MARK_ID_RED_DART                    8           //红方飞镖ID编号
#define REFEREE_MARK_ID_RED_RADAR                   9           //红方雷达ID编号
#define REFEREE_MARK_ID_RED_OUTPOST                 10          //红方前哨站ID编号
#define REFEREE_MARK_ID_RED_BASE                    11          //红方基地ID编号

#define REFEREE_MARK_ID_BULE_HERO                   101         //蓝方英雄机器人ID编号
#define REFEREE_MARK_ID_BULE_ENGINEER               102         //蓝方工程机器人ID编号
#define REFEREE_MARK_ID_BULE_INFANTRY_3             103         //蓝方3号步兵机器人ID编号
#define REFEREE_MARK_ID_BULE_INFANTRY_4             104         //蓝方4号步兵机器人ID编号
#define REFEREE_MARK_ID_BULE_INFANTRY_5             105         //蓝方5号步兵机器人ID编号
#define REFEREE_MARK_ID_BULE_AIR                    106         //蓝方空中机器人ID编号
#define REFEREE_MARK_ID_BULE_SENTRY                 107         //蓝方哨兵机器人ID编号
#define REFEREE_MARK_ID_BULE_DART                   108         //蓝方飞镖ID编号
#define REFEREE_MARK_ID_BULE_RADAR                  109         //蓝方雷达ID编号
#define REFEREE_MARK_ID_BULE_OUTPOST                110         //蓝方前哨站ID编号
#define REFEREE_MARK_ID_BULE_BASE                   111         //蓝方基地ID编号

#define REFEREE_MARK_ID_RED_HERO_CLIENT             0x0101      //红方英雄机器人选手端ID编号
#define REFEREE_MARK_ID_RED_ENGINEER_CLIENT         0x0102      //红方工程机器人选手端ID编号
#define REFEREE_MARK_ID_RED_INFANTRY_3_CLIENT       0x0103      //红方3号步兵机器人选手端ID编号
#define REFEREE_MARK_ID_RED_INFANTRY_4_CLIENT       0x0104      //红方4号步兵机器人选手端ID编号
#define REFEREE_MARK_ID_RED_INFANTRY_5_CLIENT       0x0105      //红方5号步兵机器人选手端ID编号
#define REFEREE_MARK_ID_RED_AIR_CLIENT              0x0106      //红方空中机器人选手端ID编号

#define REFEREE_MARK_ID_BULE_AIR_CLIENT             0x016A      //红方空中机器人选手端ID编号
#define REFEREE_MARK_ID_BULE_HERO_CLIENT            0x0165      //红方英雄机器人选手端ID编号
#define REFEREE_MARK_ID_BULE_ENGINEER_CLIENT        0x0166      //红方工程机器人选手端ID编号
#define REFEREE_MARK_ID_BULE_INFANTRY_3_CLIENT      0x0167      //红方3号步兵机器人选手端ID编号
#define REFEREE_MARK_ID_BULE_INFANTRY_4_CLIENT      0x0108      //红方4号步兵机器人选手端ID编号
#define REFEREE_MARK_ID_BULE_INFANTRY_5_CLIENT      0x0109      //红方5号步兵机器人选手端ID编号

#define REFEREE_MARK_ID_REFEREE_SERVER              0x8080      //裁判系统服务器

/***************************************裁判数据结构体***************************************/

//比赛状态数据 结构体 0x0001
typedef __packed struct game_status_t 
{ 
    uint8_t game_type : 4;       //比赛类型
    uint8_t game_progress : 4;   //当前比赛阶段
    uint16_t stage_remain_time; //当前阶段剩余时间 单位s
    uint64_t SyncTimeStamp;     //UNIX时间
}game_status_t;

//比赛结果数据 结构体 0x0002
typedef __packed struct game_result_t
{ 
    uint8_t winner;             //0平局 1红方胜利 2蓝方胜利
}game_result_t;

//机器人血量数据 结构体 0x0003
typedef __packed struct game_robot_HP_t
{ 
    uint16_t red_1_robot_HP;    //红1 英雄机器人血量
    uint16_t red_2_robot_HP;    //红2 工程机器人血量
    uint16_t red_3_robot_HP;    //红3 步兵机器人血量
    uint16_t red_4_robot_HP;    //红4 步兵机器人血量
    uint16_t red_5_robot_HP;    //红5 步兵机器人血量
    uint16_t red_7_robot_HP;    //红7 哨兵机器人血量
    uint16_t red_outpost_HP;    //红方前哨站血量
    uint16_t red_base_HP;       //红方基地血量
    uint16_t blue_1_robot_HP;   //蓝1 英雄机器人血量
    uint16_t blue_2_robot_HP;   //蓝2 工程机器人血量
    uint16_t blue_3_robot_HP;   //蓝3 步兵机器人血量
    uint16_t blue_4_robot_HP;   //蓝4 步兵机器人血量 
    uint16_t blue_5_robot_HP;   //蓝5 步兵机器人血
    uint16_t blue_7_robot_HP;   //蓝7 哨兵机器人血
    uint16_t blue_outpost_HP;   //蓝方前哨站血量 
    uint16_t blue_base_HP;      //蓝方基地血量 
}game_robot_HP_t;

//场地事件数据 结构体 0x0101
typedef __packed struct event_data_t
{ 
    uint32_t event_data;        //场地事件数据 详情查阅手册
}event_data_t;

//补给站动作标识数据 结构体 0x0102
typedef __packed struct 
{ 
    uint8_t reserved;               //保留位
    uint8_t supply_robot_id;        //补弹机器人ID 
    uint8_t supply_projectile_step; //出弹口开闭状态
    uint8_t supply_projectile_num;  //补弹数量
} ext_supply_projectile_action_t; 

//裁判警告数据 结构体 0x0104
typedef __packed struct 
{ 
    uint8_t level;                  //己方最后一次受到判罚的等级
    uint8_t offending_robot_id;     //己方最后一次受到判罚的违规机器人ID
    uint8_t count;                  //己方最后一次收到判罚的违规机器人对应判罚等级的违规次数
}referee_warning_t; 

//飞镖发射相关数据 结构体 0x0105
typedef __packed struct 
{ 
    uint8_t dart_remaining_time;    //己方飞镖发射剩余时间
    uint16_t dart_info;             //飞镖击中数据总览 详情查阅手册
}dart_info_t;

//机器人性能体系数据 结构体 0x0201
typedef __packed struct 
{ 
    uint8_t robot_id;                           //本机器人ID
    uint8_t robot_level;                        //机器人等级
    uint16_t current_HP;                        //机器人当前血量
    uint16_t maximum_HP;                        //机器人血量上限
    uint16_t shooter_barrel_cooling_value;      //机器人枪口热量每秒冷却值
    uint16_t shooter_barrel_heat_limit;         //机器人枪口热量上限
    uint16_t chassis_power_limit;               //机器人底盘功率上限
    uint8_t power_management_gimbal_output : 1;     //电管gimbal口输出状态
    uint8_t power_management_chassis_output : 1;    //电管chassis口输出状态
    uint8_t power_management_shooter_output : 1;    //电管shooter口输出状态
}robot_status_t; 

//实时底盘功率和枪口热量数据  结构体 0x0202
typedef __packed struct 
{ 
    uint16_t chassis_voltage;               //电管chassis口输出电压 mV
    uint16_t chassis_current;               //电管chassis口输出电流 mA
    fp32 chassis_power;                     //底盘功率 W
    uint16_t buffer_energy;                 //缓冲能量 J
    uint16_t shooter_17mm_1_barrel_heat;    //第1个17mm发射机构的枪口热量
    uint16_t shooter_17mm_2_barrel_heat;    //第2个17mm发射机构的枪口热量
    uint16_t shooter_42mm_barrel_heat;      //42mm发射机构的枪口热量
}power_heat_data_t;

//机器人位置数据  结构体 0x0203
typedef __packed struct 
{ 
    fp32 x;             //本机器人位置x坐标 m
    fp32 y;             //本机器人位置y坐标 m
    fp32 angle;         //本机器测速模块的朝向 度 正北为0度
}robot_pos_t; 

//机器人增益数据 结构体 0x0204
typedef __packed struct 
{ 
    uint8_t recovery_buff;       //机器人回血增益 %
    uint8_t cooling_buff;        //机器人枪口冷却倍率
    uint8_t defence_buff;        //机器人防御增益 %
    uint8_t vulnerability_buff;  //机器人负防御增益 %
    uint16_t attack_buff;        //机器人攻击增益 %
}buff_t; 

//空中支援事件数据 结构体 0x0205
typedef __packed struct 
{ 
    uint8_t airforce_status;    //空中机器人状态
    uint8_t time_remain;        //此状态的剩余时间 s
}air_support_data_t; 

//伤害状态数据 结构体 0x0206
typedef __packed struct 
{ 
    uint8_t armor_id : 4;            //异常或扣血的装甲板或测速模块的ID 
    uint8_t HP_deduction_reason : 4; //血量变化类型 
}hurt_data_t; 

//实时射击数据 结构体 0x0207
typedef __packed struct 
{ 
    uint8_t bullet_type;            //弹丸类型
    uint8_t shooter_number;         //发射机构ID
    uint8_t launching_frequency;    //弹丸射速 Hz
    fp32 initial_speed;            //弹丸初速 m/s
}shoot_data_t;

//允许发弹量数据 结构体 0x0208
typedef __packed struct 
{ 
    uint16_t projectile_allowance_17mm;     //17mm弹丸允许发弹量
    uint16_t projectile_allowance_42mm;     //42mm弹丸允许发弹量
    uint16_t remaining_gold_coin;           //剩余金币数量
}projectile_allowance_t;

//机器人RFID模块状态 结构体 0x0209
typedef __packed struct 
{ 
    uint32_t rfid_status;       //机器人RFID模块状态 详细查阅手册
}rfid_status_t; 

//飞镖选手端数据 结构体 0x020A
typedef __packed struct 
{ 
    uint8_t dart_launch_opening_status;     //当前飞镖发射站状态  
    uint8_t reserved;                       //保留位
    uint16_t target_change_time;            //切换击打目标时的比赛剩余时间 s
    uint16_t latest_launch_cmd_time;        //最后一次操作手确定发射指令时的比赛剩余时间 s
}dart_client_cmd_t; 
 
//地面机器人位置数据 结构体 0x020B
typedef __packed struct 
{ 
    fp32 hero_x;            //己方英雄机器人位置x轴坐标 m
    fp32 hero_y;            //己方英雄机器人位置y轴坐标 m
    fp32 engineer_x;        //己方工程机器人位置x轴坐标 m
    fp32 engineer_y;        //己方工程机器人位置y轴坐标 m
    fp32 standard_3_x;      //己方3号步兵机器人位置x轴坐标 m
    fp32 standard_3_y;      //己方3号步兵机器人位置y轴坐标 m
    fp32 standard_4_x;      //己方3号步兵机器人位置x轴坐标 m
    fp32 standard_4_y;      //己方4号步兵机器人位置y轴坐标 m
    fp32 standard_5_x;      //己方5号步兵机器人位置x轴坐标 m
    fp32 standard_5_y;      //己方5号步兵机器人位置y轴坐标 m
}ground_robot_position_t;

//雷达标记进度数据 结构体 0x020C
typedef __packed struct 
{ 
    uint8_t mark_hero_progress;         //对方英雄机器人被标记进度 
    uint8_t mark_engineer_progress;     //对方工程机器人被标记进度
    uint8_t mark_standard_3_progress;   //对方3号步兵机器人被标记进度
    uint8_t mark_standard_4_progress;   //对方4号步兵机器人被标记进度
    uint8_t mark_standard_5_progress;   //对方5号步兵机器人被标记进度
    uint8_t mark_sentry_progress;       //对方哨兵机器人被标记进度
}radar_mark_data_t;

//哨兵自主决策信息同步 结构体 0x020D
typedef __packed struct 
{ 
    uint32_t sentry_info;       //哨兵自主决策信息同步 详细查阅手册 
} sentry_info_t; 

//雷达自主决策信息同步 结构体 0x020E
typedef __packed struct 
{ 
    uint8_t radar_info;         //雷达自主决策信息同步 详细查阅手册
} radar_info_t;

//机器人交互数据 结构体
typedef __packed struct 
{ 
    uint16_t data_cmd_id;       //交互数据子内容ID
    uint16_t sender_id;         //发送者ID 需与自身ID匹配
    uint16_t receiver_id;       //接收者ID
    uint8_t user_data[113];       //内容数据段
}robot_interaction_data_t; 

//机器人交互数据 子内容ID：0x0100
typedef __packed struct 
{ 
    uint8_t delete_type;        //删除操作
    uint8_t layer;              //图层数
}interaction_layer_delete_t;

//机器人交互数据 子内容ID：0x0101
typedef __packed struct 
{   
    uint8_t figure_name[3];   
    uint32_t operate_tpye:3;   
    uint32_t figure_tpye:3;
    uint32_t layer:4;   
    uint32_t color:4;   
    uint32_t details_a:9; 
    uint32_t details_b:9; 
    uint32_t width:10;   
    uint32_t start_x:11;   
    uint32_t start_y:11;   
    uint32_t details_c:10;   
    uint32_t details_d:11;   
    uint32_t details_e:11;   
}interaction_figure_t; 

//机器人交互数据 子内容ID：0x0102
typedef __packed struct 
{ 
    interaction_figure_t interaction_figure[2];  
}interaction_figure_2_t;

//机器人交互数据 子内容ID：0x0103
typedef __packed struct 
{ 
    interaction_figure_t interaction_figure[5]; 
}interaction_figure_3_t;

//机器人交互数据 子内容ID：0x0104
typedef __packed struct 
{ 
    interaction_figure_t interaction_figure[7]; 
}interaction_figure_4_t; 

//机器人交互数据 子内容ID：0x0110
typedef __packed struct 
{ 
    //graphic_data_struct_t grapic_data_struct; 
    uint8_t data[30];
} ext_client_custom_character_t; 

//哨兵自主决策指令 结构体 0x0120
typedef __packed struct 
{ 
    uint32_t sentry_cmd;    //哨兵自主决策指令 详细查阅手册
} sentry_cmd_t;

//雷达自主决策指令 结构体 0x0121
typedef __packed struct 
{ 
    uint8_t radar_cmd;      //雷达自主决策指令 详细查阅手册
} radar_cmd_t; 
  
//选手端小地图交互数据 结构体 0x0303
typedef __packed struct 
{ 
    fp32 target_position_x;     //目标位置x轴坐标 m
    fp32 target_position_y;     //目标位置y轴坐标 m
    uint8_t cmd_keyboard;       //云台手按下的键盘按键通用键值
    uint8_t target_robot_id;    //对方机器人ID
    uint8_t cmd_source;         //信息来源ID
}map_command_t;

//选手端小地图接收雷达数据 结构体
typedef __packed struct 
{ 
    uint16_t target_robot_id;   //目标机器人ID
    fp32 target_position_x;     //目标x位置坐标 m
    fp32 target_position_y;     //目标y位置坐标 m
}map_robot_data_t;

//选手端小地图接收哨兵数据 结构体
typedef __packed struct 
{  
    uint8_t intention;          //执行动作 1：到目标点攻击 2：到目标点防守 3：移动到目标点
    uint16_t start_position_x;  //路径起点x轴坐标 dm
    uint16_t start_position_y;  //路径起点y轴坐标 dm
    int8_t delta_x[49];         //路经点x轴增量数组 dm
    int8_t delta_y[49];         //路径点y轴增量数组 dm
    uint16_t sender_id;         //发送者ID
}map_data_t;

//选手端小地图接收机器人数据 结构体
typedef __packed struct  
{   
    uint16_t sender_id;         //发送者ID
    uint16_t receiver_id;       //接收者ID
    uint8_t user_data[30];      //自定义消息，utf-16编码方式，支持中文显示
} custom_info_t; 

//自定义遥控器与机器人交互数据 结构体
typedef __packed struct 
{ 
    uint8_t data[30];           //自定义数据
}custom_robot_data_t; 

//键鼠遥控数据 结构体
typedef __packed struct 
{  
    int16_t mouse_x;            //鼠标x轴移动速度 负值表示向左移动
    int16_t mouse_y;            //鼠标y轴移动速度 负值表示向下运动
    int16_t mouse_z;            //鼠标滚轮移动速度 负值表示向后滚动
    int8_t left_button_down;    //鼠标左键是否按下 0未按下 1按下
    int8_t right_button_down;   //鼠标右键是否按下 0未按下 1按下
    uint16_t keyboard_value;    //键盘按键信息
    uint16_t reserved;          //保留位
}remote_control_t; 

//自定义遥控器与选手端交互数据 结构体
typedef __packed struct 
{ 
    uint16_t key_value;         //键盘键值
    uint16_t x_position:12;     //鼠标x轴像素位置
    uint16_t mouse_left:4;      //鼠标左键状态
    uint16_t y_position:12;     //鼠标y轴像素位置
    uint16_t mouse_right:4;     //鼠标右键状态
    uint16_t reserved;          //保留位
}custom_client_data_t;

/***************************************裁判系统全局数据结构体***************************************/

//裁判系统全局数据
typedef __packed struct referee_data_t
{
    game_status_t game_status;                                      //比赛状态
    game_result_t game_result;                                      //比赛结果
    game_robot_HP_t game_robot_HP;                                  //机器人血量数据
    event_data_t event_data;                                        //场地事件数据
    ext_supply_projectile_action_t ext_supply_projectile_action;  //补给站动作表示
    referee_warning_t referee_warning;                              //裁判警告数据
    dart_info_t dart_info;                                          //飞镖发射相关数据
    robot_status_t robot_status;                                    //机器人性能体系
    power_heat_data_t power_heat_data;                              //实时底盘功率和枪口热量数据
    robot_pos_t robot_pos;                                          //机器人位置数据
    buff_t buff;                                                    //机器人增益数据
    air_support_data_t air_support_data;                            //空中支援事件数据
    hurt_data_t hurt_data;                                          //伤害状态数据
    shoot_data_t shoot_data;                                        //实时射击数据
    projectile_allowance_t  projectile_allowance;                   //允许发弹量数据
    rfid_status_t rfid_status;                                      //机器人RFID模块状态
    dart_client_cmd_t dart_client_cmd;                              //飞镖选手端数据
    ground_robot_position_t ground_robot_position;                  //地面机器人位置数据
    radar_mark_data_t radar_mark_data;                              //雷达标记进度数据
    sentry_info_t sentry_info;                                      //哨兵自主决策信息同步
    radar_info_t radar_info;                                      //雷达自主决策信息同步

}referee_data_t;

extern void referee_parsed(uint16_t cmd_id, uint8_t* data, uint16_t data_length);  //裁判系统数据解析
extern void get_chassis_power_and_buffer(fp32* chassis_power, fp32* chassis_power_buffer); 
extern void get_chassis_max_power(uint16_t* max_power_limit);

#endif
